package webCam;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */


/**
 *
 * @author Jesus Ruiz Oliva
 */
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.media.CannotRealizeException;
import javax.media.Manager;
import javax.media.MediaLocator;
import javax.media.NoPlayerException;
import javax.media.Player;
import javax.swing.*;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Image;
import java.awt.image.RenderedImage;
import java.io.File;
import javax.imageio.ImageIO;
import javax.media.Buffer;
import javax.media.CaptureDeviceInfo;
import javax.media.CaptureDeviceManager;
import javax.media.Format;
import javax.media.control.FormatControl;
import javax.media.control.FrameGrabbingControl;
import javax.media.format.VideoFormat;
import javax.media.util.BufferToImage;


class Camara {
    private Player p;        
    //private Component video;
    private Image img;

    Camara(){
    }
    public Format[] getFormatos(CaptureDeviceInfo dev){
        // Vemos los distintos formatos con lo que se pueden configurar la camara
        Format[] format= dev.getFormats();
        return format;
        /*VideoFormat vf;
                for (int i=0;i<format.length;i++){
                    vf =(VideoFormat)format[i];
                    System.out.println("W "+vf.getSize().getWidth() + "  H " +vf.getSize().getHeight());
        }*/
    }
    public void setResolucion(Format format){
        //Con esto podemos cambiar la resolucion.Ahora mismo esta en modo ejemplo, habria que 
        //integrarlo
        FormatControl formatControl = (FormatControl)p.getControl("javax.media.control.FormatControl");                    
        javax.media.Format f = formatControl.setFormat(format);
    }
    public Component getVisualComponent(){
        //Obtenemos el componente donde se muestra la imagen        
        if (p!=null)
            return p.getVisualComponent();
        else
            return null;
    }
    public void start(){
        p.start(); // iniciamos la captura de imagen
    }
    public void stop(){
        p.stop();
    }
    public void configurarCam(){
                Manager.setHint( Manager.LIGHTWEIGHT_RENDERER, true );
                // obtenemos la capturadora de video
                CaptureDeviceInfo dev = CaptureDeviceManager.getDevice("vfw:Microsoft WDM Image Capture (Win32):0");   
                //obtengo el locator del dispositivo
                MediaLocator loc = dev.getLocator();
                //MediaLocator ml = new MediaLocator("vfw://0"); 
                try {
                    //Aqui creamos el player
                    //No usamos el metodo createPlayer, porque este metodo se encarga tambien de hacer que el player
                    //pase por todos los estados dejandolo listo para start()
                    p = Manager.createRealizedPlayer(loc);
                } catch (IOException ex) {
                    Logger.getLogger(Camara.class.getName()).log(Level.SEVERE, null, ex);
                } catch (NoPlayerException ex) {
                    Logger.getLogger(Camara.class.getName()).log(Level.SEVERE, null, ex);
                } catch (CannotRealizeException ex) {
                    Logger.getLogger(Camara.class.getName()).log(Level.SEVERE, null, ex);
                }
	}
    public Image verFoto(){            
        return img;
    }
    public Dimension verDimensionImage(){
        FormatControl formatControl = (FormatControl)p.getControl("javax.media.control.FormatControl");                    
        javax.media.Format f = formatControl.getFormat();
        VideoFormat vf =(VideoFormat)f;
        return vf.getSize();
    }
    public void CapturaFoto(){
        img=null;
        if (p!=null){
            //Recogemos el video proveniente del player(Viene en formato RAW)
            FrameGrabbingControl fgc = (FrameGrabbingControl) p.getControl("javax.media.control.FrameGrabbingControl");
            //Almacena la imagen actual del video frame. Si falla devuelve null. Viene en formato RAW
            Buffer buf = fgc.grabFrame();
            if(buf != null){
                //Creamos un objeto con el formato de la imagen
                BufferToImage btoi = new BufferToImage((VideoFormat)buf.getFormat());
                //creamos la imagen
                img = btoi.createImage(buf);
            }
        }
    }
    public void parar(){
        if (p!= null){
        //Paramos y cerramos la camaraWeb
            p.stop();
            p.close();        
            //p.deallocate();
        }
    }
}
